/*
 * @Author: your name
 * @Date: 1970-01-01 08:00:00
 * @LastEditTime: 2019-12-10 00:11:48
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: /linkedlist/linklist.h
 */
#ifndef __LINKLIST_H__
#define __LINKLIST_H__

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;

#define BUFFER_SIZE 2048
//协议
#define HTTP 0x01
#define RAW_TCP 0x02
#define UDP 0x03
#define HTTPS 0x04

//开关
#define INUSE 0x01
#define UNUSE 0x00

//定义功能结构体
typedef struct db_ldata
{
    u8 id;   //type of protocal
    u8 flag; //enable or disable
    u32 sock_fd;
    u8 *send_buffer;
    u32 (*Init)(struct db_ldata *pdata);
    u32 (*SendFunction)(struct db_ldata *pdata, void *sendbuffer);
} db_ldata_t;
typedef db_ldata_t *db_ldata_pt;

//定义链表中的节点
typedef struct db_lnode
{
    void *data;
    struct db_lnode *prev;
    struct db_lnode *next;
} db_lnode_t;

typedef db_lnode_t *db_lnode_pt;

//定义链表这个结构
typedef struct db_list
{
    u32 limit_size;
    db_lnode_pt head;
    db_lnode_pt tail;
} db_list_t;

//定义指向结构体的指针
typedef db_list_t *db_list_pt;

db_list_pt db_list_create(void);

//插入到第num个前面的位置
int __db_list_insert_before(db_list_t **list_head, int num, void *new_node_data);

//插入到第num个后面的位置
int __db_list_insert_after(db_list_t **list_head, int num, void *new_node_data);

//删除函数
void __db_list_delete(db_list_t **list_head, int num);

//查找，第几个

void *__db_list_visit(db_list_t **list_head, int num);

//遍历
void __db_list_travel(db_list_pt list_head, void (*do_function)(void *));
void __db_list_travel2(db_list_pt list_head);

//寻找某个值
int __db_list_search(db_list_t **list_head, void *find_data, int (*compare)(void *, void *));

//修改
void __db_list_modify(db_list_t *list_head, int num, void *new_node_data);

#endif